package cn.quevo.cube.provide.define.entity;

import cn.quevo.common.entity.DoEntity;
import cn.quevo.common.enums.ResultStatusEnum;
import cn.quevo.common.exception.CheckParamsException;
import cn.quevo.common.lang.BooleanUtils;
import cn.quevo.common.lang.EnumUtils;
import cn.quevo.common.lang.RegularUtils;
import cn.quevo.common.lang.StringUtils;
import cn.quevo.cube.provide.define.enums.ModelType;
import lombok.*;
import org.beetl.sql.core.annotatoin.Table;

/**
 * 模型 实体BEAN
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2018/12/11 14:57:09
 * @Copyright 湘豫（北京）科技有限公司版权所有.All Rights Reserved.
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(name = "cube_model")
public class CubeModel extends DoEntity {

    /** 模型数据库ID */
    private Long cubeDbId;
    /** 模型名称 */
    private String modelName;
    /** 是否系统模型 */
    private String systemYn;
    /** 模型编码 */
    private String modelCode;
    /** 是否物理模型 */
    private String physicalYn;
    /** 物理表名称 */
    private String tabName;
    /** 模型类型CD：CORE_物理模型,VIEW_视图模型,FORM_表单模型 */
    private String modelTypeCd;
    /** 是否启用:Y/N */
    private String enabledYn;
    /** 模型状态CD:10_新建,30_正常 */
    private String modelStatusCd;
    /** 数据表名称 */
    private String dataTabName;
    /** 介绍 */
    private String intro;
    /** 排序号 */
    private Long sortNum;

    /**
    * 公共参数验证
    */
    protected void validate() {
        if(StringUtils.isBlank(this.getModelName())){
            throw new CheckParamsException(6002, "模型名称不能为空");
        }
        if(this.getSortNum() != null && StringUtils.isBlank(this.getSortNum())){
            throw new CheckParamsException(6012, "排序错误");
        }
    }

    /**
    * 新增参数验证
    */
    public void validateCreate() {
        this.validate();

        if(StringUtils.isBlank(this.getCubeDbId())){
            throw new CheckParamsException(6001, "模型数据库不能为空");
        }
        if(StringUtils.isBlank(this.getModelCode()) || !RegularUtils.englishAndUnderline(this.getModelCode())){
            throw new CheckParamsException(6004, "模型编码不能为空且只能包含英文和下划线");
        }

        this.setSystemYn(BooleanUtils.isTrue(this.getSystemYn()) ? BooleanUtils.TRUE : BooleanUtils.FALSE);
        this.setPhysicalYn(BooleanUtils.isTrue(this.getPhysicalYn()) ? BooleanUtils.TRUE : BooleanUtils.FALSE);
        if (BooleanUtils.isTrue(this.getPhysicalYn())) {
            if(StringUtils.isBlank(this.getTabName()) || !RegularUtils.englishAndUnderline(this.getTabName())){
                throw new CheckParamsException(6006, "物理表名称错误");
            }
        }
        if(!EnumUtils.existsEnumIgnoreCase(this.getModelTypeCd(), ModelType.values())){
            throw new CheckParamsException(6007, "模型类型错误");
        }
        this.setEnabledYn(BooleanUtils.isTrue(this.getEnabledYn()) ? BooleanUtils.TRUE : BooleanUtils.FALSE);
        this.setModelStatusCd(StringUtils.isBlank(this.getModelStatusCd()) ? "30" : this.getModelStatusCd());
        this.setDataTabName(StringUtils.isBlank(this.getDataTabName()) ? "cube_model_data" : this.getDataTabName());
        if (StringUtils.isBlank(this.getDataTabName()) || !RegularUtils.englishAndUnderline(this.getDataTabName())) {
            throw new CheckParamsException(6010, "数据表名称不能为空且只能包含英文和下划线");
        }
    }

    /**
    * 修改参数验证
    */
    public void validateUpdate() {
        if (StringUtils.isBlank(this.getId())) {
            throw new CheckParamsException(ResultStatusEnum.RECORD_UNSELECTED);
        }
        this.validate();
    }
}
